const Queue = require('./01-queue_es5');

/**
 * 找到字符串第一个不重复字符
 * @param {*} str 
 * @returns 返回符合条件的字符下标，如果找不到返回-1
 */
function firstUniqChar(str) {
  // 创建哈希映射
  const map = {};
  // 创建队列
  const queue = new Queue();
  // 对str进行遍历
  for (let i = 0; i < str.length; i++) {
    // 当前元素
    let current = str[i];
    // 如果不存在，则加入映射。 这里注意0会被判定为false的问题。
    if (map[current] == null) {
      map[current] = i;
      // 同时把当前元素和下标加入队列，因为首次出现，可以作为预备人选（考察对象）。如果后续有问题，秋后算账。
      queue.enqueue([current, i]);
      // console.log(queue.items);
    } else {
      // 当前元素不是第一次出现,则修改哈希表，把value变为-1
      map[current] = -1;
      // 同时对队列（预备人选）进行排查，如果和当前元素相同，则立即出列（不再作为考察对象）。
      // 这里要使用while检测，因为出队列，下一个对头也要进行考察。直到队列的某次对头暂时符合条件。
      // 获取对头元素字符,比如 [[a,1],....] ==> a
      while (!queue.isEmpty() && map[queue.front()[0]] === -1) {
        // 不符合条件，出队列
        queue.dequeue();
      }
    }
  }
  // console.log(map);
  // console.log(queue.items);
  // 最后只要队列有一个数据经过了考验，则返回对头元素即可。否则全军覆没。
  return !queue.isEmpty() ? queue.front()[1] : -1;
}

console.log(firstUniqChar('leetcode')); // 0
console.log(firstUniqChar('loveleetcode')); // 2
console.log(firstUniqChar('hahabufanxueyuan')); // 4